broadway: Send focus out events
authorAlexander Larsson <alexl@redhat.com>
Wed, 13 Nov 2013 11:10:29 +0000 (12:10 +0100)
committerAlexander Larsson <alexl@redhat.com>
Wed, 13 Nov 2013 11:23:06 +0000 (12:23 +0100)
gdk/broadway/broadway-protocol.h
gdk/broadway/broadway-server.c
gdk/broadway/gdkeventsource.c

index bd486481d5d312f8aa3990794ac9b88caa79e03b..8447bd567aa6538d9ed8240678a38b61724348f5 100644 (file)
@@ -122,7 +122,8 @@ typedef struct {
 
 typedef struct {
   BroadwayInputBaseMsg base;
-  gint32 id;
+  gint32 new_id;
+  gint32 old_id;
 } BroadwayInputFocusMsg;
 
 typedef union {
index 0c384d8832707ccf0bd2c686520c550736bfe7bd..6aedd37b55f0ae48cec3d8af34ff9091ff372d6f 100644 (file)
@@ -1545,15 +1545,16 @@ broadway_server_focus_window (BroadwayServer *server,
   if (server->focused_window_id == new_focused_window)
     return;
 
-  /* Keep track of the new focused window */
-  server->focused_window_id = new_focused_window;
-
   memset (&focus_msg, 0, sizeof (focus_msg));
   focus_msg.base.type = BROADWAY_EVENT_FOCUS;
   focus_msg.base.time = broadway_server_get_last_seen_time (server);
-  focus_msg.focus.id = new_focused_window;
+  focus_msg.focus.old_id = server->focused_window_id;
+  focus_msg.focus.new_id = new_focused_window;
 
   broadway_events_got_input (&focus_msg, -1);
+
+  /* Keep track of the new focused window */
+  server->focused_window_id = new_focused_window;
 }
 
 guint32
index b5c9e1cb2a45dde5d4e0dec16600084b03941112..bb2a19fe64dbab394fbbd225d988399d1e6435c0 100644 (file)
@@ -345,7 +345,17 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
     break;
 
   case BROADWAY_EVENT_FOCUS:
-    window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->focus.id));
+    window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->focus.old_id));
+    if (window)
+      {
+       event = gdk_event_new (GDK_FOCUS_CHANGE);
+       event->focus_change.window = g_object_ref (window);
+       event->focus_change.in = FALSE;
+       gdk_event_set_device (event, display->core_pointer);
+       node = _gdk_event_queue_append (display, event);
+       _gdk_windowing_got_event (display, node, event, message->base.serial);
+      }
+    window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->focus.new_id));
     if (window)
       {
        event = gdk_event_new (GDK_FOCUS_CHANGE);